#pragma once

#include <vector>
#include "hidbox/types.h"

namespace hidbox {

/**
 * @brief 标准鼠标报告描述符生成器
 * 提供常用的鼠标 HID 报告描述符模板
 */
class MouseDescriptorBuilder {
public:
    /**
     * @brief 生成标准 3 键鼠标报告描述符
     * 包含 X/Y 移动和 3 个按键
     * @return 报告描述符数据
     */
    static std::vector<u8> BuildStandardMouse();

    /**
     * @brief 生成带滚轮的 5 键鼠标报告描述符
     * 包含 X/Y 移动、滚轮和 5 个按键
     * @return 报告描述符数据
     */
    static std::vector<u8> BuildMouseWithWheel();

    /**
     * @brief 生成高精度游戏鼠标报告描述符
     * 包含高精度 X/Y 移动、滚轮和 8 个按键
     * @return 报告描述符数据
     */
    static std::vector<u8> BuildGamingMouse();

    /**
     * @brief 生成自定义鼠标报告描述符
     * @param num_buttons 按键数量 (1-16)
     * @param has_wheel 是否包含滚轮
     * @param high_precision 是否使用高精度 (16位) 坐标
     * @return 报告描述符数据
     */
    static std::vector<u8> BuildCustomMouse(u8 num_buttons = 3,
                                            bool has_wheel = false,
                                            bool high_precision = false);
};

/**
 * @brief 鼠标报告数据结构
 */
struct MouseReport {
    u8 buttons{0};  // 按键状态位图
    s8 x{0};        // X 轴移动 (-127 到 127)
    s8 y{0};        // Y 轴移动 (-127 到 127)
    s8 wheel{0};    // 滚轮移动 (-127 到 127)
} __attribute__((packed));

/**
 * @brief 高精度鼠标报告数据结构
 */
struct MouseReportHighPrecision {
    u8 buttons{0};   // 按键状态位图
    s16 x{0};        // X 轴移动 (-32767 到 32767)
    s16 y{0};        // Y 轴移动 (-32767 到 32767)
    s8 wheel{0};     // 滚轮移动 (-127 到 127)
} __attribute__((packed));

}  // namespace hidbox
